<?php
require_once "../soa-dynamic/db/dbconn.php";

/*
Permite acceder a la base de datos (definida en la funcion dbConn.php)
La clase Busqueda tiene funciones para hacer Query de dos modos distintos.
Los query que terminan en SQL devuelven los resultados en una matriz en donde se puede acceder a las distintas columnas por el nombre correspondiente. Los query que no terminan en SQL solo se pueden acceder con indices numericos
(Prolijidad (con SQL) vs Velocidad (sin SQL))
Los accesos a la DB en caso de producir un error informan el error en la salida standar.

Version 1.2

*/



// QUERY: devuelve filas y columnas
// Si se pasa un array como 2do par�metro, agrega los nuevos datos a ese array
function query($sql, $lista = "") {
	if ($lista == "")
		$lista = array();
	$resultSet = mysql_query($sql);
	if ($resultSet){
		while($fila = mysql_fetch_row($resultSet)){
			if ($fila)
				$lista[] = $fila;
		}
		mysql_free_result($resultSet);
	} else {
		printSQLError($sql);
	}
	return $lista;
}

// QUERY: devuelve filas y columnas
// Si se pasa un array como 2do par�metro, agrega los nuevos datos a ese array
function querySQL($sql, $lista = "") {
	if ($lista == "")
		$lista = array();
	$resultSet = mysql_query($sql);
	if ($resultSet){
		while($fila = mysql_fetch_array($resultSet, MYSQL_ASSOC)){
			if ($fila)
				$lista[] = $fila;
		}
		mysql_free_result($resultSet);
	} else {
		printSQLError($sql);
	}
	return $lista;
}


// Crea una instancia del objeto $type, con los argumentos pasados en $args
function & createObjArray($type, $args = array()) {
    $reflection = new ReflectionClass($type);
	if ($reflection->isInstantiable()) {
		$output = $reflection->newInstance($args);
	}
//    $output     = call_user_func_array(array(&$reflection, 'newInstance'), $args);
    return $output;
}

// Realiza una query y recupera una fila. Los datos obtenidos son pasados a una Factory (funci�n). Devuelve el resultado de la Factory
// La consulta a la base procesa una sola fila
function queryObject($sql, $className) {
	$resultSet = mysql_query($sql);
	if ($resultSet){
		$datos = mysql_fetch_array($resultSet, MYSQL_ASSOC);
		if ($datos) {
			$objeto = createObjArray($className, $datos);
		}
		mysql_free_result($resultSet);
	} else {
		printSQLError($sql);
	}
	return $objeto;
}

function printSQLError($sql) {
	$msg = mysql_error();
	$code = mysql_errno();
	$sql = ereg_replace ("\n[\t ]+", '', "$sql\n");

	$backtrace = debug_backtrace();
	$trace = $backtrace[2];
	$trace2 = $backtrace[1];

	$root = str_replace('/', '\\', $_SERVER[DOCUMENT_ROOT]);
	$file = str_replace("$root\\", "", $trace2["file"]);
	$file .= " : " . $trace2["line"]. "";
	$funcion = (isset($trace["class"])) ? $trace["class"] . "::" : "";
	$funcion .= $trace["function"];
	$funcion .= ($trace["args"] ? "(...)" : "()");
?>
	<div class='sql-error' style='background:#FFF; border:2px solid black; padding: 4px;margin:10px;'>
	<strong>Error SQL #<?= $code?>:</strong>
	<pre class='sql-code' style='background:#FFC; border:1px solid black;padding: 5px 15px;margin:5px 10px;'>
<?= $sql?>
	</pre>
	<p><strong>Explanation:</strong> <?= $msg?></p>
	<p><strong>Funtion:</strong> <tt><?= $funcion?> (<?= $file?>)</tt></p>
	</div>
<?
}


// Realiza una query y recupera una fila. Los datos obtenidos son pasados a una Factory (funci�n). Devuelve el resultado de la Factory
// La consulta a la base procesa una sola fila
function queryObjectList($sql, $className) {
	$lista = array();
	$resultSet = mysql_query($sql);
	if ($resultSet){
		while($datos = mysql_fetch_array($resultSet, MYSQL_ASSOC)){
			if ($datos) {
				$objeto = createObjArray($className, $datos);
				$lista[] = $objeto;
			}
		}
		mysql_free_result($resultSet);
	} else {
		printSQLError($sql);
	}
	return $lista;
}


// QUERY COL: devuelve un array con el valor de los registros obtenidos
function queryColSQL($sql, $lista = "") {
	if ($lista == "")
		$lista = array();
	$resultSet = mysql_query($sql);
	if ($resultSet){
		while($fila = mysql_fetch_row($resultSet)){
			if ($fila)
				$lista[] = $fila[0];
		}
		mysql_free_result($resultSet);
	} else {
		echo "Error SQL:<br>$sql<br>";
		echo "mysql_error(): ".mysql_error()."<br>";
		echo "mysql_errno(): ".mysql_errno()."<br>";
	}
	return $lista;
}
function queryCol($sql, $lista = "") {
	return queryColSQL($sql, $lista);
}


// QUERY: devuelve solo una fila, con sus respectivos campos
function queryRow($sql, $lista = "") {
	$lista = query ($sql, $lista);
	if ($lista)
		return $lista[0];
}

// QUERY: devuelve solo una fila, con sus respectivos campos
function queryRowSQL($sql, $lista = "") {
// Este en verdad funciona igual que queryRowSQL, ya que el dato devuelto no tiene el nombre de un campo asociado
	$lista = querySQL ($sql, $lista);
	if ($lista)
		return $lista[0];
}

// QUERY: devuelve solo un campo
function queryField($sql, $lista = "") {
	$lista = query ($sql, $lista);
	if ($lista)
		return $lista[0][0];
}

// QUERY: devuelve solo un campo
function queryFieldSQL($sql, $lista = "") {
	$lista = query ($sql, $lista);
	if ($lista)
		return $lista[0][0];
}

// EXECUTE: para instrucciones de INSERT, DELETE, UPDATE, etc
function execute($sql) {
	mysql_query($sql);
	if (mysql_error()){
		echo "Error SQL:<br>$sql<br>";
		echo "mysql_error(): ".mysql_error()."<br>";
		echo "mysql_errno(): ".mysql_errno()."<br>";
		return false;
	}
	return true;
}

function executeSQL($sql) {
	return execute($sql);
}

function executeId($sql) {
	mysql_query($sql);
	if (mysql_error()){
		printSQLError($sql);
//		echo "Error SQL:<br>$sql<br>";
//		echo "mysql_error(): ".mysql_error()."<br>";
//		echo "mysql_errno(): ".mysql_errno()."<br>";
	}
	return mysql_insert_id();
}

function mostrarTabla ($lista, $tableClass="grid") {
//	$tableClass="grid";
	$oddRowsClass="odd";
	$odd = "";
	if (count($lista)>0) {
		if (is_array ($lista[0])) {
			$titulos = array_keys ($lista[0]);
		}
		echo "<TABLE class='$tableClass'>"; // border='1'

	if (is_array ($lista[0])) {
		echo "<TR>";
//echo "<td>FILA</td>";
		foreach ($titulos as $titulo) {
			echo "<TH>$titulo</TH>";
		}
		echo "</TR>";
	}
//$i=1;
		foreach ($lista as $fila) {
			$odd = ($odd ? "" : $oddRowsClass);
			echo "<TR class='$odd'>";
//echo "<td>$i</td>";
//$i++;
			foreach ($fila as $item) {
				echo "<TD>$item&nbsp;</TD>";
			}
			echo "</TR>";
		}
		echo "</TABLE>";
	} else {
		echo "La lista se encuentra vac&iacute;a<br>";
	}
}

function mostrarFila ($lista) {
	if (count($lista)>0) {
		echo "<TABLE>";
		foreach ($lista as $fila) {
			echo "<TR>";
			foreach ($fila as $item) {
				echo "<TD>$item&nbsp;</TD>";
			}
			echo "</TR>";
		}
		echo "</TABLE>";
	} else {
		echo "La lista se encuentra vac�a<br>";
	}
}

function mostrarTablaDB ($nombreTabla) {
	$sql = "SELECT * FROM $nombreTabla";
	mostrarTabla(querySQL($sql));
}
?>